package config

import (
	"log"

	"github.com/spf13/viper"
)

// Config 应用程序配置结构
type Config struct {
	Server struct {
		Host string
		Port int
	}
	MySQL struct {
		Host     string
		Port     int
		Username string
		Password string
		Database string
	}
	Redis struct {
		Host     string
		Port     int
		Password string
		DB       int
	}
	Coze struct {
		APIKey string
		BotID  string
	}
}

// LoadConfig 加载配置文件和环境变量
func LoadConfig() (*Config, error) {
	// 初始化viper
	viper.SetConfigName(".env")
	viper.SetConfigType("env")
	viper.AddConfigPath(".")
	viper.AddConfigPath("../..") // 支持从项目根目录加载配置

	// 读取.env文件
	err := viper.ReadInConfig()
	if err != nil {
		// 如果没有.env文件，不报错，继续使用环境变量和默认值
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			log.Println("未找到.env配置文件，将使用环境变量和默认值")
		} else {
			log.Printf("读取.env文件时出错: %v", err)
		}
	}

	// 设置环境变量前缀
	viper.SetEnvPrefix("YI_NIAN") // 使用YI_NIAN作为环境变量前缀，可避免冲突

	// 设置环境变量映射，将结构体字段映射到环境变量名称
	viper.BindEnv("server.host", "SERVER_HOST")
	viper.BindEnv("server.port", "SERVER_PORT")
	viper.BindEnv("mysql.host", "MYSQL_HOST")
	viper.BindEnv("mysql.port", "MYSQL_PORT")
	viper.BindEnv("mysql.username", "MYSQL_USER")
	viper.BindEnv("mysql.password", "MYSQL_PASSWORD")
	viper.BindEnv("mysql.database", "MYSQL_DATABASE")
	viper.BindEnv("redis.host", "REDIS_HOST")
	viper.BindEnv("redis.port", "REDIS_PORT")
	viper.BindEnv("redis.password", "REDIS_PASSWORD")
	viper.BindEnv("redis.db", "REDIS_DB")
	viper.BindEnv("coze.apikey", "COZE_API_KEY")
	viper.BindEnv("coze.botid", "COZE_BOT_ID")

	// 自动匹配环境变量（不区分大小写）
	viper.AutomaticEnv()

	// 设置默认值
	viper.SetDefault("server.host", "0.0.0.0")
	viper.SetDefault("server.port", 8080)
	viper.SetDefault("mysql.host", "localhost")
	viper.SetDefault("mysql.port", 3306)
	viper.SetDefault("mysql.username", "game")
	viper.SetDefault("mysql.password", "game")
	viper.SetDefault("mysql.database", "xianxia_game")
	viper.SetDefault("redis.host", "localhost")
	viper.SetDefault("redis.port", 6379)
	viper.SetDefault("redis.password", "")
	viper.SetDefault("redis.db", 0)
	viper.SetDefault("coze.apikey", "pat_QluHFyDbjaVZpaxY3ROjirexeEkfWFnZrY4qnZi3yfi2SXBGTQrrYFzdDrpSxPwk")
	viper.SetDefault("coze.botid", "7558712880472834086")

	// 解析配置到结构体
	var config Config
	if err := viper.Unmarshal(&config); err != nil {
		return nil, err
	}

	return &config, nil
}